package com.netty.protobuf;

import com.google.protobuf.InvalidProtocolBufferException;
import com.netty.protobuf.UserModule.User;
import com.netty.protobuf.UserModule.User.Builder;

import java.util.Arrays;

/**
 * @author 顾志杰
 * @date 2021/3/8-15:54
 */
public class TestProtobuf {

    /**
     * 序列化
     */
    public static byte[] serialObject2Bytes(){
        Builder userBuilder = UserModule.User.newBuilder();
        User user = userBuilder
                .setUserId("1")
                .setUserName("张三")
                .setAge(30)
                .addFavorite("java")
                .addFavorite("c++")
                .build();
        /*
           序列化机制：
           1. java序列化 比如一个int类型(4个字节长度)
           // int a = 2   &  int a = 110000000
           java的序列化无论真是的int类型数值大小实际占用多少个字节，在内存中都是以4个长度(32位)

           protobuf序列化机制：
           是按照实际的数据大小去动态伸缩的, 因此很多时候我们的int数据并没有实际占用到4个字节
           所以protobuf序列化后一般都会比int类型(java序列化机制)的占用长度要小很多！
         */
        byte[] data = user.toByteArray();
        System.out.println(Arrays.toString(data));
        return data;

    }

    /**
     * 反序列化
     */
    public static User serialBytes2Object(byte[] data) {
        try {
            return UserModule.User.parseFrom(data);
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
        return null;
    }



    public static void main(String[] args) {
        byte[] data = serialObject2Bytes();
        User user = serialBytes2Object(data);

        System.err.println("userId: " + user.getUserId());
        System.err.println("age: " + user.getAge());
        System.err.println("userName: " + user.getUserName());
        System.err.println("favorite: " + user.getFavoriteList());
    }
}
